package fiuba.algo3;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;

public class Ciudad {
	private String nombre, bandera, moneda, idioma, atraccion, religion, gobierno, lider;
	static final String NOMBRE_ARCHIVO_DISTANCIAS = "distancias.xml";
	static final String NOMBRE_ARCHIVO_CIUDADES = "ciudades.xml";
		
	public Ciudad(String nombre) {
		this.nombre = nombre;

		NodeList listaCiudades = new ManejadorXML().obtenerElementosDeXML( NOMBRE_ARCHIVO_CIUDADES, "ciudad" );

		if (listaCiudades != null){
			for ( int i = 0; i < listaCiudades.getLength(); i++ ){
				Element ciudad = (Element)listaCiudades.item(i);
				String nombreCiudad = ciudad.getAttribute("nombre");
				
				if ( nombreCiudad.equals( this.nombre ) ){
					this.bandera = ciudad.getAttribute("bandera");
					this.moneda = ciudad.getAttribute("moneda");
					this.idioma = ciudad.getAttribute("idioma");
					this.atraccion = ciudad.getAttribute("atraccion");
					this.religion = ciudad.getAttribute("religion");
					this.gobierno = ciudad.getAttribute("gob");
					this.lider = ciudad.getAttribute("lider");
				}
			}
		}
	}
	
	public Ciudad() {}
	
	public Node serializar(Document doc) {
		Element elementoCiudad = doc.createElement("Ciudad");
		elementoCiudad.setAttribute("nombre", this.nombre);
		elementoCiudad.setAttribute("bandera", this.bandera);
		elementoCiudad.setAttribute("moneda", this.moneda);
		elementoCiudad.setAttribute("idioma", this.idioma);
		elementoCiudad.setAttribute("atraccion", this.atraccion);
		elementoCiudad.setAttribute("religion", this.religion);
		elementoCiudad.setAttribute("gob", this.gobierno);
		elementoCiudad.setAttribute("lider", this.lider);
		
		return elementoCiudad;
	}
	
	public static Ciudad hidratar(Node elementoCiudad) {
		Ciudad nuevaCiudad = new Ciudad();
		nuevaCiudad.nombre = ((Element)elementoCiudad).getAttribute("nombre");
		nuevaCiudad.bandera = ((Element)elementoCiudad).getAttribute("bandera");
		nuevaCiudad.moneda = ((Element)elementoCiudad).getAttribute("moneda");
		nuevaCiudad.idioma = ((Element)elementoCiudad).getAttribute("idioma");
		nuevaCiudad.atraccion = ((Element)elementoCiudad).getAttribute("atraccion");
		nuevaCiudad.religion = ((Element)elementoCiudad).getAttribute("religion");
		nuevaCiudad.gobierno = ((Element)elementoCiudad).getAttribute("gob");
		nuevaCiudad.lider = ((Element)elementoCiudad).getAttribute("lider");
		return nuevaCiudad;
	}
	
	// GETTERS
	public String getNombre() {
		return nombre;
	}
	
	public String getBandera() {
		return bandera;
	}

	public String getIdioma() {
		return idioma;
	}

	public String getMoneda() {
		return moneda;
	}
	
	public String getAtraccion() {
		return this.atraccion;
	}
	
	public String getReligion() {
		return this.religion;
	}
	
	public String getLider(){
		return this.lider;
	}
	
	public String getGobierno() {
		return this.gobierno;
	}
	// FIN GETTERS

	public int obtenerDistanciaHasta(Ciudad ciudadDestino) {
		
		NodeList listaCiudades = new ManejadorXML().obtenerElementosDeXML( NOMBRE_ARCHIVO_DISTANCIAS, "ciudadOrigen" );

		if (listaCiudades != null){
			for ( int i = 0; i < listaCiudades.getLength(); i++ ){
				Element elementoCiudadOrigen = (Element)listaCiudades.item(i);
				Ciudad  ciudadOrigen = new Ciudad (elementoCiudadOrigen.getAttribute("nombre"));
				
	            if ( this.esIgualA(ciudadOrigen) ){
	            	NodeList listaCiudadesDestino = elementoCiudadOrigen.getElementsByTagName("ciudadDestino");
    	        
	            	for ( int j = 0; j < listaCiudadesDestino.getLength(); j++ ){
	    	            Element elementoPosibleCiudadDestino = (Element) listaCiudadesDestino.item(j);
			            Ciudad posibleCiudadDestino = new Ciudad(elementoPosibleCiudadDestino.getAttribute("nombre"));
			            
			            if ( ciudadDestino.esIgualA(posibleCiudadDestino) ){
			            	String distanciaString = elementoPosibleCiudadDestino.getAttribute("distancia");

			            	int distancia = Integer.parseInt(distanciaString);
			            	return distancia;
			            }
	            	}
	            }
			}
		}
		return 0;
	}
  
	public boolean esIgualA(Ciudad otraCiudad) {
		if (otraCiudad == null)
			return false;
		if ( this.getNombre().equals(otraCiudad.getNombre()) ){
			return true;
		}
		return false;
	}
	
}